package com.webserver.http;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

//请求对象
//每一个实例表示客户端发送过来的一个HTTP请求
/*每个请求由三个部分构成：
    1：请求行
    2：消息头
    3：:消息正文
 */
public class HttpServletRequest {
    private Socket socket;
    //请求行相关信息：
    private String method;//请求方式
    private String url;//抽象路径
    private String protocol;//协议版本
    //读消息头相关信息：
    private Map<String,String> headers = new HashMap<>();//使用了map集合获取消息头


    public HttpServletRequest(Socket socket) throws IOException {//完成解析请求的工作
        this.socket = socket;
        //调用解析请求行：
        parseRequestLine();

        //调用解析消息头：
        parseHeaders();

        //调用解析消息正文：
        parseContent();

    }



    //1本方法解析请求行:
    private void parseRequestLine() throws IOException {
        String line = readLine();
        System.out.println("请求行："+line);
        String[] data = line.split("\\s");//正则拆分split
        method = data[0];//请求(字符串)地址的请求方式:默认-》GET
        url = data[1];//
        protocol = data[2];
        System.out.println("method:"+method);
        System.out.println("uri:"+url);
        System.out.println("protocol:"+protocol);
    }

    //2本方法用于解析消息头：
    private void parseHeaders() throws IOException {
        while (true){
            String line = readLine();
            if (line.isEmpty()) {
                //如果读取的是空字符串说明单独读取了CRLF
                break;
            }
            System.out.println("消息头："+line);
            String[] data = line.split(":\\s");
            headers.put(data[0],data[1]);
        }
        System.out.println("headers："+headers);
    }

    //3本方法用于解析消息正文：
    private void parseContent(){}




    /*重用代码：*/
    private String readLine() throws IOException {
        InputStream in = socket.getInputStream();
        StringBuilder builder = new StringBuilder();
        char cur = 'a';//作为本次读取到的字符
        char pre = 'a';//作为上次读取到的子符
        int d;
        while ((d = in.read())!=-1){
            cur = (char)d;//本次读取到的字符
            if (pre==13 && cur==10){
                break;
            }
            builder.append(cur);//
            pre = cur;//下次循环前将本次读取到的字符记为上次读取到的字符
            System.out.print((char)d);
        }
        return builder.toString().trim();
    }


    //生成private属性：
//    因为后期不修改这三个属性值，所以不需要set方法
    public String getMethod() {
        return method;
    }

    public String getUrl() {
        return url;
    }

    public String getProtocol() {
        return protocol;
    }

    //获取消息头的方法：
    public String getHeader(String name){
        return headers.get(name);//
    }
}
